#!/bin/bash
IMGNAME=$1
#创建一个空的镜像文件
#dd if=/dev/zero of=./$IMGNAME bs=1M count=300
#镜像文件由外部传入。外部普通用户下创建文件。这样就得到了一个普通权限的img 而不是超级权限的img

echo "IMGNAME $IMGNAME"
#echo "pwd $PWD"
#给镜像文件分区
parted $IMGNAME mklabel msdos
parted $IMGNAME mkpart primary fat32 10M 110M
parted $IMGNAME mkpart primary ext4 110M 100%

sync
LOOPDEV=$(losetup -f) #可以通过losetup -f指令查看哪个loop空闲
LOOPNAME=${LOOPDEV: 5}  #字符串截取得到loopX
#echo "LOOPDEV $LOOPDEV"

#将映像文件挂接到loopX中去，如果loop49空闲，loop49可以看作是磁盘设备，其存储区域就是所挂载的镜像文件
#这样就把img文件映射为一个磁盘设备了，可以通过设备的方式对它进行访问了

losetup $LOOPDEV $IMGNAME

#使用kpartx来装载镜像文件，识别该硬盘的分区表。装载之后，就可以在/dev/mapper/目录下看到两个loopXpY的文件了。
kpartx -av $LOOPDEV

#对两个分区进行格式化
mkfs.vfat -n "boot" /dev/mapper/${LOOPNAME}p1
mkfs.ext4 /dev/mapper/${LOOPNAME}p2
e2label /dev/mapper/${LOOPNAME}p2 rootfs

sync

if [ ! -e ./boot ]
then
   mkdir -p ./boot
fi

if [ ! -e ./rootfs ]
then
   mkdir -p ./rootfs
fi

#cp -r ../rootfs/* ./rootfs

mount /dev/mapper/${LOOPNAME}p1 ./boot/
mount /dev/mapper/${LOOPNAME}p2 ./rootfs/

dd if=./u-boot-sunxi-with-spl.bin of=$IMGNAME bs=1k seek=8 conv=notrunc,sync  #conv=notrunc 不截断 保持输出镜像的完整性。就不会破坏分区

cp ./Image ./boot
cp ./sun50i-h6-orangepi-3-lts.dtb ./boot
cp ./boot.* ./boot

cp -r ./fs/* ./rootfs

umount ./boot/
umount ./rootfs/

kpartx -dv $LOOPDEV > /dev/null
losetup -d $LOOPDEV > /dev/null
#losetup -d /dev/loop18 取消loop的映射关系

rm -rf boot rootfs

sync
